Julia的官網: http://julialang.org
Julia是什麼?為什麼應該注意Julia這個新的語言呢?或者說,為什麼需要Julia呢?它有可能在資料科學中佔一席之地嗎?
我想從我自己的個人經驗談起。
雖然我並不是資訊科技從業人員,但因為工作性質的關係,scientific scripting可說是我吃飯的工具。我很少用ORIGIN/JMP/Excel之類的軟體做資料分析。試算表或是類試算表的軟體拿來處理稍微大一點的data就捉襟見肘,而且本身提供的函式庫很有限,不太能夠處理複雜度比較高的運算。C++或是Fotran雖然速度很快,但是語言本身缺乏彈性,所以開發的速度很慢,維護成本也很高。
Matlab應該是我這幾年來最常用的語言,只是因為用起來還蠻順手的,加上有一陣子不太想把python拿起來用,總覺得還要再多付出一些時間成本重新複習和熟悉語法,如此一來,愈不常用又愈不熟,一直這樣循環下來,其他語言就被封印了。Matlab有些特色是其他計算語言無法匹敵的。首先,它的文件寫的非常好,各個toolbox的功能也算是很完整很強大,應有盡有。畢竟有人在專職維護,Matlab有商業軟體應有的氣魄和格局。尤其像是解微分方程或是偏微分方程這類的應用,坊間雖然有open source的套件,但是微分方程或是偏微分方程並不像是矩陣相乘這種定義很明確的運算。以矩陣相乘這種運算來說,好的套件和沒那麼好的的套件頂多是速度上的差異,但是微分方程是門大學問,光是一個參數沒設對,解就不知道發散到那裡去了。所以對於非專家級的微分方程使用者來說,與其使用網路上下載沒什麼人驗證過的套件,花個錢買個比較可靠的solver絕對是值得的。其他像是optimization toolbox也是同樣的道理。這也是Matlab在科學以及工程界相當吃得開的原因。
但是Matlab有幾個缺點。首先,它不是open source,所以只能在它自己的IDE裡面除錯和執行。另外一個讓我很不爽的缺點是不能直接在script裡面定義function,每次要定義function就要再多開一個檔案。它也不像python一樣很容易把程式模組化,然後用from和import選擇自己想要匯入的部份。Matlab語言剛出道的時候沒有模組和物件導向的功能,都是近幾年來才加進去的功能,又為了向下相容,導致模組化和物件導向的語法用起來的感覺像是頂樓加蓋。另一個大缺點是它要付費,而且要同時在很多台機器的話,價錢就要再往上加。
Python加上numpy和scipy其實也很好用。numpy和scipy對於一般所需要用到的矩陣和一些信號處理的運算就相當夠用。加上python本身語言的彈性和特性以及其他套件的支援,發揮了加乘的效果。但是缺點也還是有的。python本身並不是為了科學運算而設計的語言,所以執行起來不夠快速。而且有的時候numpy的function回傳的物件可能是一個1x1的矩陣,但它不會自己轉成一個純量(scalar),而且一個Nx1的矩陣和一個1維向量也是不一樣的物件,有的時候用起來很惱人。
至於R....我認真試了幾個星期,用它來練習作一些mini project之後,因為用起來真的不大習慣,之後就很少用了,所以也不好評論什麼。不過它在統計界的歷史悠久,所以累積了很好的資料處理以及資料視覺化的功能。雖然它並不是我解決問題的第一首選,雖然它仍然是當今統計和資料處理的主流。
上面幾個高階語言有一些共同的特性,就是開發速度快,支援的套件多,很適合拿來很快試一下心裡面冒出來的idea。它們的共同缺點是執行速度不佳,涉及到迴圈的運算最好是能夠矩陣化或是向量化,然後丟給外部的C或是Fortran函式庫去執行。儘管許多數值運算可以很順利的矩陣化,但很多運算仍然非用迴圈或是遞迴不可,例如search。Matlab在迴圈上的執行效率近幾年(據說)已經改善很多,但是和較低階的系統語言(如C/C++)或是專業的數值運算語言(如Fortran)仍然有不小的差距,而且語言的本身並不支援平行運算,必需要靠外部的套件才能達成。
因些,以資料科學和科技運算來說,理想的語言應該可以結合像python/matlab/R的易用和彈性,
又兼具Fortran或是C的執行速度,能無縫銜接現有的C/Fortran/python/R所累積的龐大函式庫,又可以支援平行運算,並具有處理資料表格(data frame)的能力。Julia就是來自這樣的想像。Julia是由一群MIT的師生們開發出來的。Matlab的開發者當年也是MIT的學生,所以Julia頗有傳承以及致敬的意味。從程式的語法上來看,Julia的血緣和Matlab也比較接近,它看起來就像是為了改進Matlab的不足之處而生的。
Julia最大的缺點是它太年輕,函式庫沒有那麼完整,而且目前的使用者和參與開發的人也比較少,所以網路上的資源以及在各大討論區裡所能獲得的支援也比較貧乏。但這也是新語言有趣的地方,python或是R的過去我們來不及參與,但是只要我們願意,我們有機會可以參與Julia的未來。
現階段學習Julia的報酬也許不會太高,如果你完全沒有用python或是R處理資料的經驗,但是想在最短的時間在資料科學的領域開始乘風破浪的話,Julia就不應該是你目前學習的優先選項,你也不應該期待Julia能立即幫你解決問題或是找到一份待遇更好的工作。但是如果你是抱著好奇的心情,想要學習一門特別的語言增廣見聞,順便讓你在科學運算和資料處理的工具箱裡多一樣有用的工具,那麼這個30天計劃就是為你(也是為我自己)寫的。
我自己也是Julia的初學者,在這個為期30天的project裡頭,我想來介紹一下Julia的語法和特性,也為自己學習Julia留個軌跡。有別於一般tutorial的模式,我想用一個mini project來貫穿這個程式語言的特性和主題。我選的mini project是2048這個風行一時的小遊戲,如果心有餘力,也許我們可以繼續用Julia為這個2048小遊戲加上一些人工智慧,以及實作一些machine learning的演算法。不要求華麗的使用者介面的話,2048的實作本身不是太困難,但是卻可以練習到很多程式語言的基本元素。
[待續]
在 hackernews 裡常看到有關 julia 的討論,
2048 怎麼實作也很好奇,
你所訂的主題蠻有趣,期待你順利完成。